home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************
- DEMOMODUL für TwiLight
-
- THREADS
-
- Delirium Arts 1996
- Tabsize=3
-
- Das Modul ist nicht besonders originell.
- Es zeichnet zufällig Kreise, Rechtecke und Punkte auf den Schirm.
- Die einzelnem Objekte werden unabhängig voneinander als Threads
- gezeichnet.
- Es werden abwechselnd je 10 Kreise, dann 10 Ellipsen gezeichnet.
- *******************************************************************/
-
- #include <STDLIB.H>
- #include <VDI.H>
- #include <TOS.H>
- #include <STRING.H>
- #include <TWILIGHT.H>
- #include "DEMO.H"
-
-
- /* Modulkopf */
-
- MODULE_INFO module_info=
- { /* Die Info-Struktur... */
- 'XTLM', /* MAGIC */
- 0x0100, /* Versionsnummer vom Modul */
- 0x198, /* benötigte ACC-Version */
- "THREAD-DEMO", /* Modulname */
- "Delirium Arts", /* Name des Autors */
- { 0x03FF, 0xFFC0, 0x0C00, 0x0030,
- 0x1000, 0x0008, 0x2000, 0x0184,
- 0x47FF, 0x0182, 0x4C01, 0x8302,
- 0x898C, 0x8301, 0x8B8E, 0x8601,
- 0x898C, 0x84F1, 0x8820, 0x8FB1,
- 0x8471, 0x0E61, 0x8272, 0x00C1,
- 0x8306, 0x0981, 0x8154, 0x0F01,
- 0x4154, 0x0F02, 0x4154, 0x0F02,
- 0x21FC, 0x0F84, 0x1800, 0x0008,
- 0x0600, 0x0030, 0x0180, 0x00C0,
- 0x0078, 0xFF00, 0x0009, 0x0000,
- 0x000A, 0x0000, 0x000C, 0x0000
- },
- 0, /* keinen Speicher */
- TL_CHANGESCREEN | /* Schirminhalt wird verändert */
- TL_CLEARSCREEN | /* Schirm vor Start löschen durch TL */
- TL_DARKENSCREEN | /* Und auch dunkel drehen */
- TL_NEEDVSYNCS | /* bei jedem tl_check auch einen VSync machen */
- TL_NEEDTHREADS,
-
- &module_xkonfig /* Rest im Assemblerteil 'KONFIG.S' */
- };
-
- /********************
- Globale Variablen
- *********************/
-
-
- TL_INFO *tl_struct;
-
- /************************
- Der Modul-Code
- ************************/
-
- /* #include "multi_c.c" */
-
- VOID cdecl module_main(TL_INFO *TL_STRUCT)
- {
- tl_struct = TL_STRUCT;
- handle = _tl_handle; /* VDI-Handle merken */
- srand((UWORD)Random()); /* PC-Zufallsgenerator initialisieren */
- if (tl_threads_init(5,2000) < 0) ende(); /* Speicher für 5 Threads a 2000 Bytes anfordern */
-
- if (_max_colors == 2) /* Monochrom? */
- vsf_interior(handle, FIS_PATTERN); /* Füllmuster einstellen */
- else
- {
- vsf_interior(handle, FIS_SOLID);
- tl_set_col(farben, 16); /* ersten 16 Farben setzen */
- }
- vsm_color(handle, tl_fore_col); /* Markerfarbe auf Fordergrundfarbe */
-
- tl_thread_install(kreise);
- tl_thread_install(rechtecke);
- tl_thread_install(marker);
-
- while(!tl_check()) /* Hauptschleife */
- {
- tl_threads_do();
- }
-
- ende();
- return;
- }
-
- VOID ende(VOID)
- {
- tl_threads_exit();
- RETURN();
- }
-
- /********************************************************************
- Threads
- ********************************************************************/
-
-
- VOID rechtecke(VOID)
- {
- SWORD x, y, breite, hoehe, color;
- SWORD pxy[4];
-
- while(tl_thread_event() >= 0)
- {
- if (_max_colors == 2) /* monochrom? */
- {
- color=random(24)+1; /* Füllmuster auswählen */
- vsf_style(handle, color);
- }
- else
- {
- color=random(16);
- vsf_color(handle, color);
- }
- x=_vscr_x+random(_vscr_w); /* Irgendwo auf den Bildschirm */
- y=_vscr_y+random(_vscr_h); /* (nur sichtbaren Bereich beachten) */
- breite = random(50)+5;
- hoehe = random(50)+5;
- pxy[0]=x;
- pxy[1]=y;
- pxy[2]=x+breite-1;
- pxy[3]=y+hoehe-1;
-
- v_bar(handle, pxy);
- }
- return;
- }
-
- VOID marker(VOID)
- {
- SWORD pxy[2];
-
- while(tl_thread_event() >= 0)
- {
- pxy[0] = _vscr_x+random(_vscr_w); /* Irgendwo auf den Bildschirm */
- pxy[1] = _vscr_y+random(_vscr_h); /* (nur sichtbaren Bereich beachten) */
- vsm_type(handle, random(6)+1);
- v_pmarker(handle, 1, pxy);
- }
- return;
- }
-
- VOID kreise(VOID)
- {
- SWORD x,y, radius, color;
- SWORD anzahl;
-
- anzahl=10;
-
- while(anzahl-- >0)
- {
- if (tl_thread_event() < 0) break; /* wenn Thread beendet werden soll */
- if (_max_colors == 2) /* monochrom? */
- {
- color=random(24)+1; /* Füllmuster auswählen */
- vsf_style(handle, color);
- }
- else
- {
- color=random(16);
- vsf_color(handle, color);
- }
- x=_vscr_x+random(_vscr_w); /* Mittelpunkt irgendwo auf den Bildschirm */
- y=_vscr_y+random(_vscr_h); /* (nur sichtbaren Bereich beachten) */
- radius = random(40)+5;
- v_circle(handle, x,y,radius); /* Kreis zeichnen */
- }
- if (anzahl<=0)
- tl_thread_install(ellipsen); /* neuen Thread mit Elipsen starten */
- return; /* Kreisthread beenden */
- }
-
- VOID ellipsen(VOID)
- {
- SWORD x,y, color;
- SWORD anzahl;
-
- anzahl=10;
-
- while(anzahl-- >0)
- {
- if (tl_thread_event() < 0) break; /* wenn Thread beendet werden soll */
- if (_max_colors == 2) /* monochrom? */
- {
- color=random(24)+1; /* Füllmuster auswählen */
- vsf_style(handle, color);
- }
- else
- {
- color=random(16);
- vsf_color(handle, color);
- }
- x=_vscr_x+random(_vscr_w); /* Mittelpunkt irgendwo auf den Bildschirm */
- y=_vscr_y+random(_vscr_h); /* (nur sichtbaren Bereich beachten) */
- v_ellipse(handle, x, y, random(50)+2, random(50)+2);
- }
- if (anzahl<=0)
- tl_thread_install(kreise); /* ab jetzt Kreise zeichnen */
- return;
- }
-